// run: $exec < input
#include <iostream>
#include <cstring>
#include <queue>
#include <utility>

struct data
{
	int x, y;
};

int const  inf = 1 << 27;
int const maxn = 300;
data da[maxn];
int map[maxn][maxn];
int d[maxn][maxn];
bool vis[maxn][maxn];
long long n, m, k, r;

long long dis_s(int x, int y)
{
	long long dx = da[x].x - da[y].x;
	long long dy = da[x].y - da[y].y;
	return dx * dx + dy * dy;
}

int spfa()
{
	typedef std::pair<int, int> pair;
	std::queue<pair> q;
	memset(vis, 0, sizeof(vis));
	memset(d, 0x3f3f3f3f, sizeof(d));
	d[0][0] = 0;
	vis[0][0] = 1;
	pair s(0, 0);
	q.push(s);
	while (!q.empty()) {
		s = q.front(); q.pop();
		for (int i = 0; i < n + m; i++) {
			if (map[s.first][i]) {
				pair tmp(i, s.second);
				if (i >= n) tmp.second++;
				if (tmp.second <=k && d[tmp.first][tmp.second] > d[s.first][s.second] + 1) {
					d[tmp.first][tmp.second] = d[s.first][s.second] + 1;
					if (!vis[tmp.first][tmp.second]) {
						vis[tmp.first][tmp.second] =  true;
						q.push(tmp);
					}
				}
			}
		}
	}
	int ans = inf;
	for (int i = 0; i <= k; i++)
		ans = std::min(ans, d[1][i]);
	return ans - 1;
}

int main()
{
	std::ios::sync_with_stdio(false);
	while (std::cin >> n >> m >> k >> r) {
		for (int i = 0; i < n + m; i++)
			for (int j = 0; j < n + m; j++) map[i][j] = 0;
		for (int i = 0; i < n + m; i++) std::cin >> da[i].x >> da[i].y;

		for (int i = 0; i < n + m; i++)
			for (int j = i + 1; j < n + m; j++)
				if (dis_s(i, j) <= r * r)
					map[i][j] = map[j][i] = 1;

		std::cout << spfa() << "\n";
	}
}

